package com.ssy.lingxi.order.utils;

import com.ssy.lingxi.order.model.constant.OrderServiceContants;
import org.springframework.util.StringUtils;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Objects;

/**
 * 日期时间工具类
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-15
 */
public class OrderDateTimeUtil {
    /**
     * 当前时间往后n小时
     * @param hours 小时
     * @return 时间日期字符串
     */
    public static String findDateAfterHours(long hours) {
        return LocalDateTime.now().plusHours(hours).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
    }

    /**
     * 将日期字符串转换为Unix时间戳格式
     * @param dayString yyyy-MM-dd格式的字符串
     * @return Unix时间戳（精确到毫秒）
     */
    public static long dayStringToTimestamp(String dayString) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date date = simpleDateFormat.parse(dayString);
            return date.getTime();
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * 将日期字符串转换为Unix时间戳格式
     * @param dayTimeString yyyy-MM-dd HH:mm:ss 格式的字符串
     * @return Unix时间戳（精确到毫秒）
     */
    public static long dayTimeToTimestamp(String dayTimeString) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = simpleDateFormat.parse(dayTimeString);
            return date.getTime();
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * 将Unix时间戳转换为日期时间格式
     * @param timestamp Unix时间戳
     * @return yyyy-MM-dd HH:mm:ss 格式的字符串
     */
    public static String timestampToDateTimeString(long timestamp) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(timestamp);
        return simpleDateFormat.format(date);
    }

    /**
     * 将Unix时间戳转换为LocalDateTime
     * @param timestamp Unix时间戳
     * @return LocalDateTime （yyyy-MM-dd HH:mm:ss）
     */
    public static LocalDateTime timestampToLocalDateTime(Long timestamp) {
        if(timestamp == null) {
            return LocalDateTime.now();
        }

        return LocalDateTime.parse(timestampToDateTimeString(timestamp), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 获取当前（今天）的日期
     * @return yyyy-MM-dd格式字符串
     */
    public static String getCurrentDate() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }

    /**
     * LocalDateTime转换为Unix时间戳
     * @param localDateTime LocalDateTime实例
     * @return Unix时间戳（精确到毫秒）
     */
    public static long localDateTimeToTimestamp(LocalDateTime localDateTime) {
        if (Objects.isNull(localDateTime)) {
            return 0L;
        }

        return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    /**
     * 校验格式为 yyyy-MM-dd HH:mm-HH:mm的订单配送时间段
     * @param value  配送时间段
     * @return 格式是否正确
     */
    public static boolean checkDatePeriod(String value) {
        if(!value.contains(" ") || !value.contains("-")) {
            return false;
        }

        String d1 = value.substring(0, value.lastIndexOf("-"));
        String d2 = value.substring(value.lastIndexOf("-") + 1);

        LocalDateTime dt1;
        try {
            dt1 = LocalDateTime.parse(d1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
        } catch (Exception ignored) {
            return false;
        }

        String d3 = dt1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).concat(" ").concat(d2);
        LocalDateTime dt2;
        try {
            dt2 = LocalDateTime.parse(d3, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
        } catch (Exception ignored) {
            return false;
        }

        return dt1.compareTo(dt2) <= 0;
    }

    /**
     * 转换配送时间
     * @param value yyyy-MM-dd 或 yyyy-MM-dd HH:mm 或 yyyy-MM-dd HH:mm:ss 格式的字符串
     * @return 日期，如转换错误，返回null
     */
    public static LocalDateTime findDeliverTime(String value) {
        if(!StringUtils.hasText(value)) {
            return null;
        }

        try {
            return LocalDateTime.parse(value, OrderServiceContants.DEFAULT_DATE_FORMATTER);
        } catch (Exception ignored) {
        }

        try {
            return LocalDateTime.parse(value, OrderServiceContants.DEFAULT_MINUTE_TIME_FORMATTER);
        } catch (Exception ignored) {
        }

        try {
            return LocalDateTime.parse(value, OrderServiceContants.DEFAULT_TIME_FORMATTER);
        } catch (Exception ignored) {
        }

        return null;
    }
}
